{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JndnmDMp66FL"
      },
      "source": [
        "##### Copyright 2023 Google LLC.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "hMqWDc_m6rUC"
      },
      "outputs": [],
      "source": [
        "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vsS6OoYqWfqb"
      },
      "source": [
        "\n",
        "# How to work with insertion/deletion forward processes\n",
        "\n",
        "This notebook shows how to construct and manipulate probability distributions  for discrete insertion/deletion diffusion processes, as described in [\"Beyond In-Place Corruption: Insertion and Deletion in Denoising Probabilistic Models\"](https://arxiv.org/abs/2107.07675).\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wqAn-pTN6iHA"
      },
      "source": [
        "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google-research/google-research/blob/master/d3pm/insertdelete/Insertion_and_Deletion_Forward_Process_Guide.ipynb)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hmLxdk2D5YQG"
      },
      "source": [
        "### Setup and imports"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UxOrT9g05XWV",
        "outputId": "820ab7e0-1f4a-43e7-dadf-af21bd477cf0"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Cloning into 'google-research'...\n",
            "remote: Enumerating objects: 17221, done.\u001b[K\n",
            "remote: Counting objects: 100% (17221/17221), done.\u001b[K\n",
            "remote: Compressing objects: 100% (14097/14097), done.\u001b[K\n",
            "remote: Total 17221 (delta 2630), reused 11246 (delta 2129), pack-reused 0\u001b[K\n",
            "Receiving objects: 100% (17221/17221), 192.78 MiB | 20.72 MiB/s, done.\n",
            "Resolving deltas: 100% (2630/2630), done.\n",
            "Already on 'master'\n",
            "Your branch is up to date with 'origin/master'.\n"
          ]
        }
      ],
      "source": [
        "!git clone https://github.com/google-research/google-research.git --depth=1 --no-checkout\n",
        "!cd google-research\n",
        "!git sparse-checkout init --cone\n",
        "!git sparse-checkout set d3pm\n",
        "!git switch master"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 42,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "gfCDCBvN59gv",
        "outputId": "5e279b44-ec79-4286-e760-2555f59d8df0"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
            "Requirement already satisfied: flax~=0.6.4 in /usr/local/lib/python3.8/dist-packages (0.6.4)\n",
            "Requirement already satisfied: rich>=11.1 in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (13.3.1)\n",
            "Requirement already satisfied: tensorstore in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (0.1.32)\n",
            "Requirement already satisfied: numpy>=1.12 in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (1.22.4)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (3.2.2)\n",
            "Requirement already satisfied: jax>=0.3.16 in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (0.3.25)\n",
            "Requirement already satisfied: msgpack in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (1.0.4)\n",
            "Requirement already satisfied: optax in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (0.1.4)\n",
            "Requirement already satisfied: typing-extensions>=4.1.1 in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (4.5.0)\n",
            "Requirement already satisfied: PyYAML>=5.4.1 in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (6.0)\n",
            "Requirement already satisfied: orbax in /usr/local/lib/python3.8/dist-packages (from flax~=0.6.4) (0.1.2)\n",
            "Requirement already satisfied: opt-einsum in /usr/local/lib/python3.8/dist-packages (from jax>=0.3.16->flax~=0.6.4) (3.3.0)\n",
            "Requirement already satisfied: scipy>=1.5 in /usr/local/lib/python3.8/dist-packages (from jax>=0.3.16->flax~=0.6.4) (1.7.3)\n",
            "Requirement already satisfied: markdown-it-py<3.0.0,>=2.1.0 in /usr/local/lib/python3.8/dist-packages (from rich>=11.1->flax~=0.6.4) (2.1.0)\n",
            "Requirement already satisfied: pygments<3.0.0,>=2.14.0 in /usr/local/lib/python3.8/dist-packages (from rich>=11.1->flax~=0.6.4) (2.14.0)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->flax~=0.6.4) (3.0.9)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.8/dist-packages (from matplotlib->flax~=0.6.4) (0.11.0)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->flax~=0.6.4) (1.4.4)\n",
            "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->flax~=0.6.4) (2.8.2)\n",
            "Requirement already satisfied: chex>=0.1.5 in /usr/local/lib/python3.8/dist-packages (from optax->flax~=0.6.4) (0.1.6)\n",
            "Requirement already satisfied: jaxlib>=0.1.37 in /usr/local/lib/python3.8/dist-packages (from optax->flax~=0.6.4) (0.3.25+cuda11.cudnn805)\n",
            "Requirement already satisfied: absl-py>=0.7.1 in /usr/local/lib/python3.8/dist-packages (from optax->flax~=0.6.4) (1.4.0)\n",
            "Requirement already satisfied: cached_property in /usr/local/lib/python3.8/dist-packages (from orbax->flax~=0.6.4) (1.5.2)\n",
            "Requirement already satisfied: etils in /usr/local/lib/python3.8/dist-packages (from orbax->flax~=0.6.4) (1.0.0)\n",
            "Requirement already satisfied: importlib_resources in /usr/local/lib/python3.8/dist-packages (from orbax->flax~=0.6.4) (5.10.2)\n",
            "Requirement already satisfied: dm-tree>=0.1.5 in /usr/local/lib/python3.8/dist-packages (from chex>=0.1.5->optax->flax~=0.6.4) (0.1.8)\n",
            "Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.8/dist-packages (from chex>=0.1.5->optax->flax~=0.6.4) (0.12.0)\n",
            "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.8/dist-packages (from markdown-it-py<3.0.0,>=2.1.0->rich>=11.1->flax~=0.6.4) (0.1.2)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.8/dist-packages (from python-dateutil>=2.1->matplotlib->flax~=0.6.4) (1.15.0)\n",
            "Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.8/dist-packages (from importlib_resources->orbax->flax~=0.6.4) (3.13.0)\n"
          ]
        }
      ],
      "source": [
        "!pip install \"flax~=0.6.4\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "id": "5u0NX4oQ-PQl"
      },
      "outputs": [],
      "source": [
        "from d3pm.insertdelete import transition_operator\n",
        "from d3pm.insertdelete import forward_process"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "id": "Q1D5b0C0Dlb4"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import jax\n",
        "import jax.numpy as jnp"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "id": "KJxJfNLHYUJU"
      },
      "outputs": [],
      "source": [
        "%matplotlib inline\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib as mpl\n",
        "plt.ion()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "id": "EA47RVcIYZin"
      },
      "outputs": [],
      "source": [
        "np.set_printoptions(linewidth=150)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7grJ96ccFIci"
      },
      "source": [
        "## Constructing a distribution"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "id": "mYyIwX3sE5YU",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "30836567-37e6-48aa-d80a-59114762bc1d"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "WARNING:jax._src.lib.xla_bridge:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
          ]
        }
      ],
      "source": [
        "def unstringify(s, max_len):\n",
        "  \"\"\"Converts a string to a wrapped sequence.\"\"\"\n",
        "  arr = np.full((max_len,), -3, dtype=np.int32)\n",
        "  arr[:len(s)] = [\"!x+abcdeABCDE\".find(t)-3 for t in s]\n",
        "  return forward_process.DynamicLengthSentinelSequence(arr, len(s))\n",
        "\n",
        "def stringify_tok(tok):\n",
        "  \"\"\"Transforms a token into a string.\"\"\"\n",
        "  return \"!x+abcdeABCDE\"[tok+3]\n",
        "\n",
        "def stringify(dyn_seq):\n",
        "  \"\"\"Transforms a sequence of tokens into a string.\"\"\"\n",
        "  return \"\".join(\"!x+abcdeABCDE\"[t+3] for t in list(dyn_seq.tokens[:dyn_seq.length]))\n",
        "\n",
        "def treeslice(i, obj):\n",
        "  return jax.tree_map(lambda v: v[i], obj)\n",
        "\n",
        "def treestack(objs):\n",
        "  return jax.tree_multimap(lambda *args: jnp.stack(list(args)), *objs)\n",
        "\n",
        "def tree_unstack(objs):\n",
        "  length = jax.tree_leaves(objs)[0].shape[0]\n",
        "  return [treeslice(i, objs) for i in range(length)]\n",
        "\n",
        "def mk_A(swap_prob):\n",
        "  \"\"\"Builds a transition matrix that swaps lowercase and capital letters.\"\"\"\n",
        "  return transition_operator.LogMatrixOperator.from_probs(\n",
        "      (1-swap_prob) * np.eye(10)\n",
        "      + swap_prob * np.roll(np.eye(10), 5, 0))\n",
        "\n",
        "\n",
        "def mk_D_logits(upper_prob):\n",
        "  \"\"\"Builds a vector of token probabilities for insertions.\"\"\"\n",
        "  return np.log(np.array([(1 - upper_prob)/5] * 5 + [upper_prob/5] * 5))\n",
        "\n",
        "# High noise schedule\n",
        "noise_test_0_to_1 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.3), lp_insert=jnp.log(0.41),\n",
        "    A=mk_A(.21), D_insert_logits=mk_D_logits(.1))\n",
        "noise_test_1_to_2 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.19), lp_insert=jnp.log(0.24),\n",
        "    A=mk_A(.05), D_insert_logits=mk_D_logits(.3))\n",
        "noise_test_2_to_3 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.34), lp_insert=jnp.log(0.23),\n",
        "    A=mk_A(.08), D_insert_logits=mk_D_logits(.5))\n",
        "noise_test_3_to_4 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.0), lp_insert=jnp.log(0.0),\n",
        "    A=mk_A(.12), D_insert_logits=mk_D_logits(.7))\n",
        "\n",
        "# Lower noise schedule; uncomment to try a different noise schedule.\n",
        "# noise_test_0_to_1 = forward_process.OneStepDistn(\n",
        "#     lp_delete=jnp.log(0.09), lp_insert=jnp.log(0.065),\n",
        "#     A=mk_A(.031), D_insert_logits=mk_D_logits(.1))\n",
        "# noise_test_1_to_2 = forward_process.OneStepDistn(\n",
        "#     lp_delete=jnp.log(0.079), lp_insert=jnp.log(0.064),\n",
        "#     A=mk_A(.011), D_insert_logits=mk_D_logits(.15))\n",
        "# noise_test_2_to_3 = forward_process.OneStepDistn(\n",
        "#     lp_delete=jnp.log(0.034), lp_insert=jnp.log(0.023),\n",
        "#     A=mk_A(.021), D_insert_logits=mk_D_logits(.5))\n",
        "# noise_test_3_to_4 = forward_process.OneStepDistn(\n",
        "#     lp_delete=jnp.log(0.0), lp_insert=jnp.log(0.0),\n",
        "#     A=mk_A(.041), D_insert_logits=mk_D_logits(.7))\n",
        "\n",
        "noise_test_multi_0_to_0 = forward_process.ManyStepDistn.identity_for(noise_test_0_to_1)\n",
        "noise_test_multi_0_to_1 = noise_test_multi_0_to_0.then(noise_test_0_to_1, check=True)\n",
        "noise_test_multi_0_to_2 = noise_test_multi_0_to_1.then(noise_test_1_to_2, check=True)\n",
        "noise_test_multi_0_to_3 = noise_test_multi_0_to_2.then(noise_test_2_to_3, check=True)\n",
        "noise_test_multi_0_to_4 = noise_test_multi_0_to_3.then(noise_test_3_to_4, check=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "obu0LO32h1aK"
      },
      "source": [
        "## Helper functions"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "id": "-rKuv93DFQKS"
      },
      "outputs": [],
      "source": [
        "def show_aligned(sequences, alignments, ax=None, figsize=(5,5), fontsize=18):\n",
        "  \"\"\"Visualizes a trajectory of aligned sequences.\"\"\"\n",
        "  max_length = 0\n",
        "  if ax is None:\n",
        "    fig = plt.figure(figsize=figsize)\n",
        "    ax = fig.gca()\n",
        "\n",
        "  if alignments == \"onestep\":\n",
        "    alignments = []\n",
        "    for xt, xtplus1 in zip(sequences[:-1], sequences[1:]):\n",
        "      alignments.append(forward_process.align_one_step(xt, xtplus1))\n",
        "\n",
        "  for y, seq in enumerate(sequences):\n",
        "    seqstr = stringify(seq)\n",
        "    max_length = max(max_length, len(seqstr))\n",
        "    for x, char in enumerate(seqstr):\n",
        "      ax.text(x, y, char, ha=\"center\", va=\"center\", fontsize=fontsize)\n",
        "\n",
        "  for y, align in enumerate(alignments):\n",
        "    if align.reroll_mask is None:\n",
        "      colors = np.full_like(align.backpointers, 2)\n",
        "    else:\n",
        "      colors = np.where(align.reroll_mask, 1, 0)\n",
        "    colors = np.where(align.delete_sentinels, 3, colors)[:align.after_length]\n",
        "    for x, (backptr, c) in enumerate(zip(align.backpointers[:align.after_length], colors)):\n",
        "      if backptr == forward_process.SequenceAlignment.NO_BACKPOINTER:\n",
        "        continue\n",
        "      ax.plot([backptr, x], [y + 0.2, y+1 - 0.2], c=mpl.cm.tab10(c))\n",
        "\n",
        "  ax.set_xlim((-.5, max_length-.5))\n",
        "  ax.set_ylim((-.5, len(sequences)-.5))\n",
        "  ax.invert_yaxis()\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "id": "z211qXeRC1i2"
      },
      "outputs": [],
      "source": [
        "def show_marginals(sequence, marginal, figsize=(5,5), fontsize=18, ax=None, clip_deletes=6, num_alts=3):\n",
        "  \"\"\"Visualizes a vector of marginal probabilities.\"\"\"\n",
        "\n",
        "  if ax is None:\n",
        "    fig = plt.figure(figsize=figsize)\n",
        "    ax = fig.gca()\n",
        "\n",
        "  seqlen = sequence.length\n",
        "  if clip_deletes:\n",
        "    max_deletes = clip_deletes\n",
        "  else:\n",
        "    max_deletes = marginal.log_prob_number_of_preceding_deletes.shape[1]\n",
        "\n",
        "  seqstr = stringify(sequence)\n",
        "  for x, char in enumerate(seqstr):\n",
        "    ax.text(x, -1, char, ha=\"center\", va=\"center\", fontsize=fontsize)\n",
        "\n",
        "  for i in range(seqlen):\n",
        "    best_toks = np.argsort(-marginal.previous_token_log_probs[i])\n",
        "    for j, tok in enumerate(best_toks[:num_alts]):\n",
        "      alpha = np.exp(marginal.previous_token_log_probs[i, tok])\n",
        "      ax.text(i, -3-j, stringify_tok(tok), ha=\"center\", va=\"center\", fontsize=fontsize, alpha=alpha)\n",
        "\n",
        "\n",
        "  ax.imshow(jnp.exp(marginal.log_prob_number_of_preceding_deletes[:seqlen+1, :]).T, cmap=mpl.cm.Reds, vmin=0, vmax=1)#, extent=(-0.5, max_deletes-0.5, -0.5, seqlen-0.5))\n",
        "  ax.imshow(jnp.exp(marginal.was_insert_log_prob)[None, :seqlen], extent=(-0.5, seqlen-0.5, -2.5, -1.5), cmap=mpl.cm.Blues, vmin=0, vmax=1)\n",
        "\n",
        "  ax.set_xlim((-.5, seqlen+.5))\n",
        "  ax.set_ylim((-2.5-num_alts, max_deletes-.5))\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "w36TrWcuHF_S"
      },
      "source": [
        "## Working with insertion-deletion forward processes"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "PPk7LLayHNX8"
      },
      "source": [
        "### Sampling one step"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "colab": {
          "height": 341,
          "base_uri": "https://localhost:8080/"
        },
        "id": "_dKhAHeRl025",
        "outputId": "3405b6e2-32b7-4016-d9bc-608e5ccc5d36"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "+axx++De\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "# Generate one random sample using the 0->1 transition probabilities.\n",
        "seq, alignment = forward_process.sample_noise_step(\n",
        "    sequence=unstringify(\"abcde\", 32),\n",
        "    distn=noise_test_0_to_1,\n",
        "    rng=jax.random.PRNGKey(0))\n",
        "print(stringify(seq))\n",
        "show_aligned([unstringify(\"abcde\", 32), seq], [alignment])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NT9nzxS6Hlqn"
      },
      "source": [
        "In this sample:\n",
        "- multiple new insertion sentinel tokens (\"+\") are inserted\n",
        "- b and c are replaced with delete sentinels (\"x\")\n",
        "- \"a\" and \"e\" are copied unchanged\n",
        "- \"d\" is modified into \"D\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "metadata": {
        "id": "mFUF3B0tHOiY",
        "outputId": "7ed49c4b-8499-40c6-f2d8-16765aa26e40",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-17-cfef1419032b>:22: FutureWarning: jax.tree_leaves is deprecated, and will be removed in a future release. Use jax.tree_util.tree_leaves instead.\n",
            "  length = jax.tree_leaves(objs)[0].shape[0]\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['++a+cdbex',\n",
              " 'ac++cded',\n",
              " 'xCce++ea',\n",
              " 'acd+eed+',\n",
              " '+acD+Eex',\n",
              " 'xCeBeB++',\n",
              " '++acc+xeb',\n",
              " 'acdxx+b',\n",
              " 'xxD++++bex',\n",
              " 'xc+e+axx',\n",
              " 'a+ccBeB',\n",
              " 'acabx+x',\n",
              " 'x+ce+dec',\n",
              " 'a++cCde+E+',\n",
              " 'xcxDeD',\n",
              " 'ax+xxex++',\n",
              " 'xcdd+ec',\n",
              " 'axedeB',\n",
              " 'A+x+bBex',\n",
              " '++a+cea+ex',\n",
              " '+a+CBBec',\n",
              " 'x+cxbe+a+',\n",
              " 'ac+bcxD+',\n",
              " 'axc+Cea',\n",
              " '+a++cA+d++xd',\n",
              " 'acDEea',\n",
              " '+a+cxAxx',\n",
              " 'ac++bde+b',\n",
              " 'accae+c',\n",
              " 'xcbxeA+']"
            ]
          },
          "metadata": {},
          "execution_count": 21
        }
      ],
      "source": [
        "# Generate a number of random samples using the 1->2 transition probabilities.\n",
        "seqs, alignments = jax.vmap(lambda rng: forward_process.sample_noise_step(\n",
        "    sequence=unstringify('axcx++e+', 32),\n",
        "    distn=noise_test_1_to_2,\n",
        "    rng=rng))(jax.random.split(jax.random.PRNGKey(0), 30))\n",
        "[stringify(s) for s in tree_unstack(seqs)]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JAs7QUn2IX0A"
      },
      "source": [
        "### Sampling multiple steps"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "colab": {
          "height": 320,
          "base_uri": "https://localhost:8080/"
        },
        "id": "DgzOisKPIFi8",
        "outputId": "272e8132-d9ca-4820-8ed4-c31bb5a62150"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "rng = jax.random.PRNGKey(1)\n",
        "\n",
        "cur_sequence = unstringify(\"abcde\", 32)\n",
        "sequences = [cur_sequence]\n",
        "alignments = []\n",
        "for distn in [noise_test_0_to_1,\n",
        "              noise_test_1_to_2,\n",
        "              noise_test_2_to_3,\n",
        "              noise_test_3_to_4]:\n",
        "  rng, key = jax.random.split(rng)\n",
        "  cur_sequence, alignment = forward_process.sample_noise_step(\n",
        "    sequence=cur_sequence,\n",
        "    distn=distn,\n",
        "    rng=key)\n",
        "  sequences.append(cur_sequence)\n",
        "  alignments.append(alignment)\n",
        "\n",
        "show_aligned(sequences, alignments)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CPCGh5YzIcRi"
      },
      "source": [
        "### Inferring one-step alignments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UL3UMtRiIjRJ"
      },
      "source": [
        "It is always possible to deterministically infer an alignment for adjacent sequences."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "metadata": {
        "colab": {
          "height": 320,
          "base_uri": "https://localhost:8080/"
        },
        "id": "dt10wAwPIabE",
        "outputId": "79b03b02-d537-4cf0-84bf-70900da990fc"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "inferred_alignments = [forward_process.align_one_step(s1, s2) for s1, s2 in zip(sequences[:-1], sequences[1:])]\n",
        "show_aligned(sequences, inferred_alignments)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EtJB0lmeJA4e"
      },
      "source": [
        "### Expanding to multi-step alignments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BHk3YgnYJKmY"
      },
      "source": [
        "We can skip timesteps and chain the alignments together."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "metadata": {
        "colab": {
          "height": 324,
          "base_uri": "https://localhost:8080/"
        },
        "id": "COtv1Zt_I11B",
        "outputId": "acda602d-fedb-4345-b3ca-e17e376bfa98"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "show_aligned(\n",
        "    [sequences[0], sequences[2], sequences[4]],\n",
        "    [\n",
        "      alignments[0].then(alignments[1]),\n",
        "      alignments[2].then(alignments[3])\n",
        "    ])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JUFy1ifrJeZZ"
      },
      "source": [
        "Orange lines here represent \"reroll\" alignments: a token was deleted, but before it was deleted, another token was inserted to the right of it. Keeping track of these alignments is necessary to avoid ambiguities across consecutive insertions and deletions."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MWRNdJ8WJ7N3"
      },
      "source": [
        "### Sampling multiple steps at once"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uxu2qS7fJ-IX"
      },
      "source": [
        "We can chain together multiple distributions, then sample from the chained distribution. This is statistically equivalent to rolling out samples from the individual steps, but can be done more efficiently."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "metadata": {
        "id": "Ao4dOJc8K-4m"
      },
      "outputs": [],
      "source": [
        "start = unstringify('axcx++e+', 32)\n",
        "seqs, alignments = jax.vmap(lambda rng: forward_process.sample_noise_step(\n",
        "    sequence=start,\n",
        "    distn=forward_process.ManyStepDistn.from_single_step(noise_test_1_to_2).then(noise_test_2_to_3),\n",
        "    rng=rng))(jax.random.split(jax.random.PRNGKey(0), 30))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "colab": {
          "height": 596,
          "base_uri": "https://localhost:8080/"
        },
        "id": "fPv2gXLCLj8d",
        "outputId": "bff2ba82-caba-4aca-fcd5-ef37110d47ba"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1080x720 with 20 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "fig, axs = plt.subplots(ncols=4, nrows=5, figsize=(15, 10))\n",
        "for i in range(axs.size):\n",
        "  show_aligned([start, treeslice(i, seqs)], [treeslice(i, alignments)], ax=axs[np.unravel_index(i, axs.shape)])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "d765DfAJK6_K"
      },
      "source": [
        "### Computing log probs"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vO4Vcmk_K_dR"
      },
      "source": [
        "We can use our distributions to compute the (log of the) probability of obtaining a particular sequence after another. If we have a fixed alignment, this is straightforward to compute."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "id": "S-RyjgYHKJ1f",
        "outputId": "b7a199ed-c14f-461a-e01b-d5f7d9c4d0a5",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "DeviceArray(-10.007076, dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 27
        }
      ],
      "source": [
        "forward_process.multi_step_aligned_log_prob(\n",
        "    unstringify('axcx+e+', 32),\n",
        "    unstringify('xc++xex', 32),\n",
        "    forward_process.align_one_step(unstringify('axcx+e+', 32), unstringify('xc++xex', 32)),\n",
        "    forward_process.ManyStepDistn.from_single_step(noise_test_1_to_2),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mw5CewHFM1BU"
      },
      "source": [
        "Over multiple steps, we can still compute log probs, as long as we have a multi-step alignment. (Note that this is the probability of observing this alignment and also this output,  marginalized over intermediate steps.)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "metadata": {
        "colab": {
          "height": 627,
          "base_uri": "https://localhost:8080/"
        },
        "id": "XNKGi1ipLd4C",
        "outputId": "9ed223a9-a1ac-4e83-bb12-98610365b643"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "# Set up some sequences\n",
        "sequence_strings = [\n",
        "  'abcde',\n",
        "  '++x+b+c++xx++',\n",
        "  'edeb+axbdDD',\n",
        "  'edeb+axbdDD',\n",
        "  'ex++ebxAbdDD',\n",
        "]\n",
        "sequences = [unstringify(s, 16) for s in sequence_strings]\n",
        "inferred_alignments = [forward_process.align_one_step(s1, s2) for s1, s2 in zip(sequences[:-1], sequences[1:])]\n",
        "show_aligned(sequences, inferred_alignments)\n",
        "show_aligned([sequences[0], sequences[3]], [inferred_alignments[0].then(inferred_alignments[1]).then(inferred_alignments[2])])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 29,
      "metadata": {
        "id": "vHHqZ-TqNc1t",
        "outputId": "33aaa912-b936-496c-d6dc-289f05805ab0",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "DeviceArray(-41.96258, dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 29
        }
      ],
      "source": [
        "forward_process.multi_step_aligned_log_prob(\n",
        "    source=sequences[0],\n",
        "    target=sequences[3],\n",
        "    distn=noise_test_multi_0_to_3,\n",
        "    alignment=inferred_alignments[0].then(inferred_alignments[1]).then(inferred_alignments[2]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CgiPqcJJOOEs"
      },
      "source": [
        "### Resampling intermediate values conditioned on an alignment"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qY1zzMkROQUs"
      },
      "source": [
        "Given sequences at times 0 and T, and an alignment between them, we can sample an intermediate sample at time T-1. This produces the same overall distribution of samples as sampling each of the timesteps in the original order, but allows us to generate multiple hypothetical intermediate states given a fixed final state."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "colab": {
          "height": 592,
          "base_uri": "https://localhost:8080/"
        },
        "id": "TBGRHgoaN45s",
        "outputId": "3f2fb14a-25ae-4b98-e49a-5612782d1569"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1440x720 with 35 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAABHcAAAI/CAMAAADKqsUSAAAAOHRFWHRTb2Z0d2FyZQBtYXRwbG90bGliIHZlcnNpb24zLjIuMiwgaHR0cDovL21hdHBsb3RsaWIub3JnL5YfjIkAAAAJcEhZcwAACxIAAAsSAdLdfvwAAADAUExURUdwTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zQ0NFaYxh4eHg8PD/v7/CF4tf+BEn9/fwQEBNYoKb29vXt7e/X2987OzpeXl4Cy1GBgYOBcXePj4//7+VZWVi+BubS0tP7y7ampqdvp80GLv+ry+CoqKsXc7PvbzpfA3K/O5P3n3oeHiP+SMmulzdk4Of+kVO7u7v+1dP/GlPPCwzAwMOiDhP/VsUpKSu+treuYmORwcN1LS3FxcUdwTCaXy3MAAABAdFJOUwDqmrp6Xj/N2R7//////////////////////////////////////////////////////////////////////wCTYaE/AAAgAElEQVR42uxdC3fauBLO7u1uuuZh05CSB1GJAxSDw2OBQjDp//9Z1y/Jki3Jki2Z5F7pnD3HZcH+Op/m08xo5F5dmWGGGWaYYYYZZphhhhlmmGGGGWaYYYYZZphhhhlmmGGGGWaYYYYZ/NFtfYzxh4GoF6Ixo4H4gWZjy/oY49pA1AvRmNFANLPRUG2YNhCN7hg7Gt0xZjQQzWw0EA3TBqLRHWNHozvGjAaimY0GomHaQDS6Y6g2TBumDUQzGw1EY0YD8RPMxs4t8yaP3z+GHT8BRC5IrTCFmWYC1GzDT2/GzwaRje+iTBvdMbpjdMfojtEdoztGd4zu/E/qzt9fv37BQL52uj9fUpSvP7uPg+T66Ue3+zu5vPvV/fHjO/q4c68dYw4ihhGHiGFsHiKOkYSYA8mypAacwkxjAKk21GRCKaaZXGtnuyrTLIjNMk1ApHv0RZi++vrP1fU/GciXJ/ul+5RY8efTv60Ej/3r92CQiKXdebVfbuDH3+ynzrNujDmIGEYMIobxAhBxjCREEiTLkjpwCjOdAaTaUJcJpZhmca2f7YpMsyA2zDQBkerRl2H67/9cXX35QgZlv5InR8r33Inx3HVt+Pvb6JMU/F10/fqoGSMNYooxg4hjbB4igZGESIBkWlIHTmGmEUC6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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "x0 = sequences[0]\n",
        "x3 = sequences[3]\n",
        "alignment_0_to_3 = inferred_alignments[0].then(inferred_alignments[1]).then(inferred_alignments[2])\n",
        "\n",
        "key = jax.random.PRNGKey(1)\n",
        "\n",
        "def sample_one_intermediate(key):\n",
        "  return forward_process.sample_intermediate(\n",
        "      x0, x3, alignment_0_to_3, noise_test_multi_0_to_2, noise_test_2_to_3, key)\n",
        "\n",
        "(x2, alignment_0_to_t, alignment_t_to_tplus1) = jax.vmap(sample_one_intermediate)(jax.random.split(key, 5 * 7))\n",
        "\n",
        "\n",
        "fig, axs = plt.subplots(ncols=7, nrows=5, figsize=(20, 10))\n",
        "for i in range(axs.size):\n",
        "  show_aligned([x0, treeslice(i, x2), x3], treeslice(i, [alignment_0_to_t, alignment_t_to_tplus1]), ax=axs[np.unravel_index(i, axs.shape)], fontsize=12)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SbIkse5HdN8W"
      },
      "source": [
        "Note that this allows us to sample in reverse! We can:\n",
        "\n",
        "- choose our starting sequence at time 0,\n",
        "- use multi-step sampling to directly sample the output at the final timestep T,\n",
        "- then repeatedly use `sample_intermediate` to generate a sequence at time T-1, then again at time T-2, and so on, until we have generated values for all timesteps."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kvnJAIhSVZoV"
      },
      "source": [
        "### Intermediate marginals"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ozQTpoqcVe0e"
      },
      "source": [
        "Instead of sampling individual intermediate sequences, we can also compute \"marginals\". These give probabilities of previous tokens aggregated at a per-token level."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "id": "8Y5kehi3Vv90",
        "outputId": "1d0cf921-6f3a-4b66-d915-5f332cb85f2b",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "-17.218935\n"
          ]
        }
      ],
      "source": [
        "marginals, expected_log_prob = forward_process.intermediate_marginals(x0, x3, alignment_0_to_3, noise_test_multi_0_to_2, noise_test_2_to_3)\n",
        "print(expected_log_prob)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 32,
      "metadata": {
        "colab": {
          "height": 646,
          "base_uri": "https://localhost:8080/"
        },
        "id": "nTpLKSxYGdm-",
        "outputId": "0ec2d054-f656-4ad8-c09d-ac0235868f37"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.8/dist-packages/jax/_src/numpy/lax_numpy.py:3463: UserWarning: 'kind' argument to argsort is ignored; only 'stable' sorts are supported.\n",
            "  warnings.warn(\"'kind' argument to argsort is ignored; only 'stable' sorts \"\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "show_aligned([x0, x3], [alignment_0_to_3])\n",
        "show_marginals(x3, marginals)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7n3_m0_cWIct"
      },
      "source": [
        "In this plot:\n",
        "- The letters in the middle (at row -1) are the tokens in the sequence `x3`, same as they appear in the previous figure.\n",
        "- Red denotes probability of there being a given number of delete tokens at time T-1 that existed before the token in the middle at time T, with higher squares denoting more delete tokens (e.g. a red square at 0 is the probability of no delete tokens, a red square one step above is the probability of one, and so on). Note that we don't compute anything here for insert tokens because the insert tokens did not exist at time T-1. Also, delete tokens are more likely to have appeared before reroll alignments (orange lines in the top plot), since the reroll alignments are only generated by combinations of insertions and deletions.\n",
        "- Blue denotes the probability that this token at time T used to be an insert token at time T-1.\n",
        "- Gray letters below the blue denote possible values for this token at the previous step, and are ranked and shaded based on their likelihood at previous steps. Due to the configuration of the transition matrix in the setup section above, letters are most likely to have stayed the same, but some letters could have switched capitalization, and a delete sentinel at time T could have been any token at time T-1."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CiTuSy6Jdkw3"
      },
      "source": [
        "These marginals are important because they serve as the output representation for our neural network models. These models are given the sequence at time T (e.g. the sequence shown in the middle of the plot), and they predict distributions over inserts, previous token values, and numbers of previous deletion sentinels."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8FIBJPmmeD9V"
      },
      "source": [
        "We can also sample a new sequence from these marginals. Note that this is *NOT* statistically equivalent to running `sample_intermediate`, since `sample_intermediate` keeps track of interactions between tokens and the marginals do not. However, the less noise there is in the forward process, the less uncertainty there is in the marginals, so sampling from the marginals can produce a good approximation of the distribution we want. When sampling from our learned models, we use this approach, since our model only learns the marginals."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 33,
      "metadata": {
        "id": "iP4lYjhjeoAb",
        "outputId": "8f288a83-7c58-4863-f3ac-d3fb0a55868e",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "+d+b++bd++\n",
            "e+ebacxbx+x++\n",
            "+deb++bdxDD\n",
            "e+exbxab++xd+\n",
            "+deBaEbdxD+\n",
            "++x+ba+B+xx+D\n",
            "e+ebaEx+dx+D\n",
            "++ebaD+dx++\n",
            "++eb++b+xDD\n",
            "ed+xxba++xdx++\n"
          ]
        }
      ],
      "source": [
        "for i in range(10):\n",
        "  sample_from_marginals = marginals.sample(jax.random.PRNGKey(i))\n",
        "  print(stringify(sample_from_marginals))\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wf0biYTKPjw5"
      },
      "source": [
        "### Resampling multi-step alignments"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2ucaE_PKPqGT"
      },
      "source": [
        "If we don't have an alignment between the initial and final sequence, it's also possible to infer one using dynamic programming across multiple steps of the sequence. (Note that this is much more expensive than using a single fixed alignment; when training a model it ends up being more efficient to just remember the original alignment.)\n",
        "\n",
        "The first step is to compute a table of possible token-level alignments between sequences."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 34,
      "metadata": {
        "colab": {
          "height": 180,
          "base_uri": "https://localhost:8080/"
        },
        "id": "z---qcL2K8Us",
        "outputId": "77136da9-0ea4-4ed5-8217-3daaba92ee91"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7f077b280e80>"
            ]
          },
          "metadata": {},
          "execution_count": 34
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "alignment_table = forward_process.compute_multi_step_alignment_table(\n",
        "    x0,\n",
        "    x3,\n",
        "    noise_test_multi_0_to_3)\n",
        "\n",
        "fig, axs = plt.subplots(ncols=2, nrows=1, figsize=(10, 5))\n",
        "axs[0].imshow(alignment_table[0][:x0.length,:x3.length])\n",
        "axs[1].imshow(alignment_table[1][:x0.length,:x3.length])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c_9uWFP4Qr4J"
      },
      "source": [
        "Given this, we can then sample individual alignments using an iterative process (somewhat similar to sampling from the posterior of a hidden Markov model)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 35,
      "metadata": {
        "colab": {
          "height": 596,
          "base_uri": "https://localhost:8080/"
        },
        "id": "1wlZ3cCyPBJX",
        "outputId": "2efd0ab4-1047-4283-9cdc-8a1067e57696"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1440x720 with 35 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "def sample_one_alignment(key):\n",
        "  return forward_process.sample_alignment_from_table(\n",
        "      source=x0,\n",
        "      target=x3,\n",
        "      distn=noise_test_multi_0_to_3,\n",
        "      alignment_table=alignment_table,\n",
        "      rng=key)\n",
        "\n",
        "key = jax.random.PRNGKey(2)\n",
        "alignments_stacked = jax.vmap(sample_one_alignment)(jax.random.split(key, 5 * 7))\n",
        "\n",
        "\n",
        "fig, axs = plt.subplots(ncols=7, nrows=5, figsize=(20, 10))\n",
        "for i in range(axs.size):\n",
        "  show_aligned([x0, x3], treeslice(i, [alignments_stacked]), ax=axs[np.unravel_index(i, axs.shape)], fontsize=12)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l3kf8cLzTxEi"
      },
      "source": [
        "#### Advanced: Rao-Blackwell over a reduced dynamic programming table"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-I_ELgY7RqhS"
      },
      "source": [
        "An advanced trick is to only compute the DP table for entries that are close to the diagonal, which can be more efficient for large sequences."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 36,
      "metadata": {
        "colab": {
          "height": 180,
          "base_uri": "https://localhost:8080/"
        },
        "id": "WszkJ5QvRULG",
        "outputId": "0deae557-27e8-4a4c-9381-923040ae7a6f"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7f077f3d55e0>"
            ]
          },
          "metadata": {},
          "execution_count": 36
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "alignment_table_banded = forward_process.compute_multi_step_alignment_table(\n",
        "    x0,\n",
        "    x3,\n",
        "    noise_test_multi_0_to_3,\n",
        "    pack_block_size=2,\n",
        "    use_dynamic_band=True)\n",
        "\n",
        "fig, axs = plt.subplots(ncols=2, nrows=1, figsize=(10, 5))\n",
        "axs[0].imshow(alignment_table_banded[0][:x0.length,:x3.length])\n",
        "axs[1].imshow(alignment_table_banded[1][:x0.length,:x3.length])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X7JBU0HVSPE4"
      },
      "source": [
        "Note that if we sample an alignment using this table, it will only sample an alignment that matches tokens that are close to one another spatially, and won't do large numbers of consecutive insertions or deletions.\n",
        "\n",
        "If we want to average something over all alignments, we can use a trick called Rao-Blackwellization or conditional marginalization:\n",
        "- if our original sample was contained in this diagonal \"dynamic band\", we can draw a bunch of other samples within that dynamic band, and average over them\n",
        "- if our original sample was not contained in the band, we just keep the value from our original sample.\n",
        "\n",
        "It turns out that this has less variance than just using the original sample's value, if we want to estimate some quantity across all possible alignments. However, this ends up being quite slow in practice, and isn't usually worth doing."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9-G2yOJFU_Dw"
      },
      "source": [
        "If we use the originally sampled alignment, it is in the band, and we can resample other well-aligned alignments using our table."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 37,
      "metadata": {
        "colab": {
          "height": 596,
          "base_uri": "https://localhost:8080/"
        },
        "id": "VvSCCpfTR1Pa",
        "outputId": "661c3131-99db-4057-f673-bde52761fa90"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1440x720 with 35 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "def sample_one_alignment(key):\n",
        "  return forward_process.rao_blackwellize_dynamic_band_alignment(\n",
        "      source=x0,\n",
        "      target=x3,\n",
        "      distn=noise_test_multi_0_to_2,\n",
        "      alignment=alignment_0_to_3,\n",
        "      alignment_table=alignment_table_banded,\n",
        "      rng=key)\n",
        "\n",
        "key = jax.random.PRNGKey(2)\n",
        "alignments_stacked = jax.vmap(sample_one_alignment)(jax.random.split(key, 5 * 7))\n",
        "\n",
        "fig, axs = plt.subplots(ncols=7, nrows=5, figsize=(20, 10))\n",
        "for i in range(axs.size):\n",
        "  show_aligned([x0, x3], treeslice(i, [alignments_stacked]), ax=axs[np.unravel_index(i, axs.shape)], fontsize=12)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 38,
      "metadata": {
        "colab": {
          "height": 903,
          "base_uri": "https://localhost:8080/"
        },
        "id": "HZAWYGzSTWBe",
        "outputId": "da652e63-df68-4773-b5db-2f528b1897b8"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1440x720 with 35 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "# This is the sampled alignment at indes 26 in `alignments_stacked` above.\n",
        "# It's a possible alignment, but it requires a large number of insertions.\n",
        "out_of_band_alignment = forward_process.SequenceAlignment(\n",
        "    backpointers=jnp.array([-1,  3,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]),\n",
        "    delete_sentinels=jnp.array([0, 0, 0, 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0]).astype(bool),\n",
        "    before_length=jnp.array(5),\n",
        "    after_length=jnp.array(11),\n",
        "    is_single_step=False,\n",
        "    reroll_mask=jnp.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]).astype(bool))\n",
        "\n",
        "show_aligned([x0, x3], [out_of_band_alignment], fontsize=12)\n",
        "\n",
        "def sample_one_alignment(key):\n",
        "  return forward_process.rao_blackwellize_dynamic_band_alignment(\n",
        "      source=x0,\n",
        "      target=x3,\n",
        "      distn=noise_test_multi_0_to_2,\n",
        "      alignment=out_of_band_alignment,  # uses our manual assignment instead\n",
        "      alignment_table=alignment_table_banded,\n",
        "      rng=key)\n",
        "\n",
        "key = jax.random.PRNGKey(2)\n",
        "alignments_stacked = jax.vmap(sample_one_alignment)(jax.random.split(key, 5 * 7))\n",
        "\n",
        "fig, axs = plt.subplots(ncols=7, nrows=5, figsize=(20, 10))\n",
        "for i in range(axs.size):\n",
        "  show_aligned([x0, x3], treeslice(i, [alignments_stacked]), ax=axs[np.unravel_index(i, axs.shape)], fontsize=12)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WG8VCapkaCjF"
      },
      "source": [
        "### Computing the number of tokens at the final timestep"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YkvyJebvaJ5H"
      },
      "source": [
        "For simplicity, we assume that the final step of the forward process deletes everything. This means that the only information left at the final timestep is just the number of deletions that happened."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 39,
      "metadata": {
        "id": "mkyYi9pUbkfn"
      },
      "outputs": [],
      "source": [
        "\n",
        "# Main schedule\n",
        "noise_test_0_to_1 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.3), lp_insert=jnp.log(0.35),\n",
        "    A=mk_A(.21), D_insert_logits=mk_D_logits(.1))\n",
        "noise_test_1_to_2 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.19), lp_insert=jnp.log(0.14),\n",
        "    A=mk_A(.15), D_insert_logits=mk_D_logits(.3))\n",
        "noise_test_2_to_3 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.34), lp_insert=jnp.log(0.23),\n",
        "    A=mk_A(.18), D_insert_logits=mk_D_logits(.5))\n",
        "noise_test_3_to_4 = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(0.4), lp_insert=jnp.log(0.2),\n",
        "    A=mk_A(.12), D_insert_logits=mk_D_logits(.7))\n",
        "\n",
        "# Last step deletes everything\n",
        "noise_test_4_to_5_terminal = forward_process.OneStepDistn(\n",
        "    lp_delete=jnp.log(1.0), lp_insert=jnp.log(0.0),\n",
        "    A=mk_A(.5), D_insert_logits=mk_D_logits(.5))\n",
        "\n",
        "noise_test_multi_0_to_0 = forward_process.ManyStepDistn.identity_for(noise_test_0_to_1)\n",
        "noise_test_multi_0_to_1 = noise_test_multi_0_to_0.then(noise_test_0_to_1, check=True)\n",
        "noise_test_multi_0_to_2 = noise_test_multi_0_to_1.then(noise_test_1_to_2, check=True)\n",
        "noise_test_multi_0_to_3 = noise_test_multi_0_to_2.then(noise_test_2_to_3, check=True)\n",
        "noise_test_multi_0_to_4 = noise_test_multi_0_to_3.then(noise_test_3_to_4, check=True)\n",
        "noise_test_multi_0_to_5_terminal = noise_test_multi_0_to_4.then(noise_test_4_to_5_terminal, check=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 40,
      "metadata": {
        "colab": {
          "height": 320,
          "base_uri": "https://localhost:8080/"
        },
        "id": "6M_LGw-kUj1P",
        "outputId": "e1cc27ab-9303-4e5c-8927-3aeb993e8359"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 360x360 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAATIAAAEvCAMAAADxUL2yAAAAOHRFWHRTb2Z0d2FyZQBtYXRwbG90bGliIHZlcnNpb24zLjIuMiwgaHR0cDovL21hdHBsb3RsaWIub3JnL5YfjIkAAAAJcEhZcwAACxIAAAsSAdLdfvwAAADAUExURUdwTP///wAAADIyMgAAAAAAAAAAAAAAAAAAAAAAANYoKeBcXVaYxvz7+/7+/iB4tb+/vwwMDPX4+j09PRwcHO3t7YqKitgzNPzy8ix/uLq6uuXv9tPk8L/Y6frn5zuIvXt7e9tAQaCgoGpqaoGz1ZW/21dXV/jb26rM491OT/bNzSgoKPO/v+Li4vCxsuJpauV3d5WVlXCoz66urueDhEmQwuyYme6kpNbW1mGfyumNjktLS8zMzNzc3MfHx0dwTNCKyZwAAABAdFJOUwD////hqEDNG3L//////////////////////////////////////////////////////////////////////wAwWkY0AAAZGUlEQVR42uxda1viPBPelvWw1QZbClRUBFFAYDkogsf9/z/rTUEgmZk2Q0Xq9bzNl93NJml7M5lT5m5//cpb3vKWt7zlLW9521vzCnkj2u8EyApW3oh2lEOWQ5ZDlkOWQ5ZDlkOWQ5ZDlkOWQ5ZDlkOWQ5YdZDf2GXv5oJRDtmvIyp59o/77zJbNC9rPSp9fKXl28HbjamP67ZoA86L234dsYutDzuz2zc2k5Xl/110ffbtUuamU7IY+JrBLZX1e1P77kBVKE/tDg6yyRLKylrG+/bj4y/tEH+O27Dc47ydszHKj4Nn9hq9BVmsEdl/9PYVbKXheYaJ0/W173tuHBplf6cu+d/Xy7/ZNeS09yqM/2qu1xET7fw2e0ubHyxCyw9+//6iQPQetyaSt/JwRZIV+pdJXdZBbst8qk5aCTzmwW5N24JW0Qa1JJfBUzFqeb70Fmk5qlMt/a/3NxixpUqjBc7NBczEvavuH7Pfxr6NjBTJ3oXMb9j8VsqAcYeJtRK+yvHfl0RsLRFu2AlnFri2wVLp8rx1JVA2p8f5G/XueFQfZu92G6v9t75AdHvz69eePrsvccvnMnqiQVTYIfGokzwfr9oMI678qZIX+Qgxatq+rRTdoq3C0arXHShCspcwOYiH72Cy/mCfbezaQ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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "rng = jax.random.PRNGKey(1)\n",
        "\n",
        "x0 = unstringify(\"abcdeABCDE\", 64)\n",
        "cur_sequence = x0\n",
        "sequences = [cur_sequence]\n",
        "alignments = []\n",
        "for distn in [noise_test_0_to_1,\n",
        "              noise_test_1_to_2,\n",
        "              noise_test_2_to_3,\n",
        "              noise_test_3_to_4,\n",
        "              noise_test_4_to_5_terminal]:\n",
        "  rng, key = jax.random.split(rng)\n",
        "  cur_sequence, alignment = forward_process.sample_noise_step(\n",
        "    sequence=cur_sequence,\n",
        "    distn=distn,\n",
        "    rng=key)\n",
        "  sequences.append(cur_sequence)\n",
        "  alignments.append(alignment)\n",
        "\n",
        "show_aligned(sequences, alignments)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SgviWZsGbBl2"
      },
      "source": [
        "We can directly compute the distribution of final step lengths without sampling."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 41,
      "metadata": {
        "colab": {
          "height": 282,
          "base_uri": "https://localhost:8080/"
        },
        "id": "sRMuk2QOa_1j",
        "outputId": "e7466a21-0371-4011-e06c-ffd53c81667c"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f077c4d24c0>]"
            ]
          },
          "metadata": {},
          "execution_count": 41
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "terminal_length_log_probs = forward_process.terminal_sentinel_distribution(x0, noise_test_multi_0_to_5_terminal)\n",
        "terminal_length_probs = np.exp(terminal_length_log_probs)\n",
        "plt.plot(np.arange(terminal_length_log_probs.shape[0]), terminal_length_probs, \"x-\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lfzbSaf6fAGI"
      },
      "source": [
        "Note that this distribution depends on the number of tokens in the original input, which will be different for different dataset samples. We train our models to predict a version of this distribution averaged across many dataset samples. To use it for generation, we sample a number of sentinels for time T according to our learned copy of this distribution, then run our model to try to infer the token values that existed at time T-1."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [
        "JndnmDMp66FL",
        "l3kf8cLzTxEi"
      ],
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
